package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imut.lagain.entity.MemoryEntry;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 记忆条目服务接口
 */
public interface IMemoryEntryService extends IService<MemoryEntry> {
    
    /**
     * 创建记忆条目
     * @param entry 条目信息
     * @return 是否创建成功
     */
    boolean createEntry(MemoryEntry entry);
    
    /**
     * 根据胶囊ID获取所有条目，按排序值和创建时间正序排列
     * @param capsuleId 胶囊ID
     * @return 条目列表
     */
    List<MemoryEntry> getEntriesByCapsuleId(Long capsuleId);
    
    /**
     * 根据胶囊ID分页获取条目
     * @param capsuleId 胶囊ID
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> getEntriesByCapsuleId(Long capsuleId, Page<MemoryEntry> page);
    
    /**
     * 根据胶囊ID分页获取条目
     * @param capsuleId 胶囊ID
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByCapsuleId(Long capsuleId, int pageNum, int pageSize);
    
    /**
     * 根据胶囊ID分页获取条目
     * @param capsuleId 胶囊ID
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> getEntriesByCapsuleIdWithPage(Long capsuleId, Page<MemoryEntry> page);
    
    /**
     * 根据胶囊ID分页获取条目
     * @param capsuleId 胶囊ID
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByCapsuleIdWithPage(Long capsuleId, int pageNum, int pageSize);
    
    /**
     * 创建文本条目
     * @param capsuleId 胶囊ID
     * @param content 文本内容
     * @return 创建的条目
     */
    MemoryEntry createTextEntry(Long capsuleId, String content);
    
    /**
     * 创建文本条目
     * @param capsuleId 胶囊ID
     * @param userId 用户ID
     * @param content 文本内容
     * @return 创建的条目
     */
    MemoryEntry createTextEntry(Long capsuleId, Long userId, String content);
    
    /**
     * 创建图片条目
     * @param capsuleId 胶囊ID
     * @param fileUrl 图片URL
     * @param fileName 文件名
     * @param fileSize 文件大小
     * @return 创建的条目
     */
    MemoryEntry createImageEntry(Long capsuleId, String fileUrl, String fileName, Long fileSize);
    
    /**
     * 创建图片条目（简化版本）
     * @param capsuleId 胶囊ID
     * @param content 描述内容
     * @param fileName 文件名
     * @return 创建的条目
     */
    MemoryEntry createImageEntry(Long capsuleId, String content, String fileName);
    
    /**
     * 创建图片条目（带用户ID和文件URL）
     * @param capsuleId 胶囊ID
     * @param userId 用户ID
     * @param fileUrl 文件URL
     * @param content 描述内容
     * @return 创建的条目
     */
    MemoryEntry createImageEntry(Long capsuleId, Long userId, String fileUrl, String content);
    
    /**
     * 创建语音条目
     * @param capsuleId 胶囊ID
     * @param fileUrl 语音URL
     * @param fileName 文件名
     * @param fileSize 文件大小
     * @param duration 语音时长（秒）
     * @return 创建的条目
     */
    MemoryEntry createAudioEntry(Long capsuleId, String fileUrl, String fileName, Long fileSize, Integer duration);
    
    /**
     * 创建语音条目（简化版本）
     * @param capsuleId 胶囊ID
     * @param content 描述内容
     * @param fileName 文件名
     * @return 创建的条目
     */
    MemoryEntry createAudioEntry(Long capsuleId, String content, String fileName);
    
    /**
     * 创建语音条目（带用户ID和文件URL）
     * @param capsuleId 胶囊ID
     * @param userId 用户ID
     * @param fileUrl 文件URL
     * @param content 描述内容
     * @return 创建的条目
     */
    MemoryEntry createAudioEntry(Long capsuleId, Long userId, String fileUrl, String content);
    
    /**
     * 创建视频条目
     * @param capsuleId 胶囊ID
     * @param fileUrl 视频URL
     * @param fileName 文件名
     * @param fileSize 文件大小
     * @param duration 视频时长（秒）
     * @return 创建的条目
     */
    MemoryEntry createVideoEntry(Long capsuleId, String fileUrl, String fileName, Long fileSize, Integer duration);
    
    /**
     * 创建视频条目（简化版本）
     * @param capsuleId 胶囊ID
     * @param content 描述内容
     * @param fileName 文件名
     * @return 创建的条目
     */
    MemoryEntry createVideoEntry(Long capsuleId, String content, String fileName);
    
    /**
     * 创建视频条目（带用户ID和文件URL）
     * @param capsuleId 胶囊ID
     * @param userId 用户ID
     * @param fileUrl 文件URL
     * @param content 描述内容
     * @return 创建的条目
     */
    MemoryEntry createVideoEntry(Long capsuleId, Long userId, String fileUrl, String content);
    
    /**
     * 根据条目类型查询
     * @param entryType 条目类型
     * @return 条目列表
     */
    List<MemoryEntry> getEntriesByType(String entryType);
    
    /**
     * 根据条目类型分页查询
     * @param entryType 条目类型
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> getEntriesByType(String entryType, Page<MemoryEntry> page);
    
    /**
     * 根据条目类型分页查询
     * @param entryType 条目类型
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByType(String entryType, int pageNum, int pageSize);
    
    /**
     * 根据胶囊ID和条目类型查询
     * @param capsuleId 胶囊ID
     * @param entryType 条目类型
     * @return 条目列表
     */
    List<MemoryEntry> getEntriesByCapsuleIdAndType(Long capsuleId, String entryType);
    
    /**
     * 根据胶囊ID和条目类型分页获取条目
     * @param capsuleId 胶囊ID
     * @param entryType 条目类型
     * @param page 分页参数
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByCapsuleIdAndType(Long capsuleId, String entryType, Page<MemoryEntry> page);
    
    /**
     * 根据胶囊ID和条目类型分页获取条目
     * @param capsuleId 胶囊ID
     * @param entryType 条目类型
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByCapsuleIdAndType(Long capsuleId, String entryType, int pageNum, int pageSize);
    
    /**
     * 根据文件URL查询条目
     * @param fileUrl 文件URL
     * @return 条目信息
     */
    MemoryEntry getEntryByFileUrl(String fileUrl);
    
    /**
     * 统计条目数量
     * @param capsuleId 胶囊ID（null表示所有胶囊）
     * @param entryType 条目类型（null表示所有类型）
     * @param hasFile 是否包含文件（null表示所有）
     * @return 条目数量
     */
    Long countEntries(Long capsuleId, String entryType, Boolean hasFile);
    
    /**
     * 更新条目排序
     * @param entryId 条目ID
     * @param sortOrder 新的排序值
     * @return 是否更新成功
     */
    boolean updateSortOrder(Long entryId, Integer sortOrder);
    
    /**
     * 批量更新条目排序
     * @param entryIds 条目ID列表
     * @param sortOrders 对应的排序值列表
     * @return 更新的条目数量
     */
    int batchUpdateSortOrder(List<Long> entryIds, List<Integer> sortOrders);
    
    /**
     * 根据内容模糊查询条目
     * @param content 内容关键字
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> searchEntriesByContent(String content, Page<MemoryEntry> page);
    
    /**
     * 根据内容模糊查询条目
     * @param content 内容关键字
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> searchEntriesByContent(String content, int pageNum, int pageSize);
    
    /**
     * 在指定胶囊中根据内容模糊查询条目
     * @param capsuleId 胶囊ID
     * @param content 内容关键字
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> searchEntriesByContentInCapsule(Long capsuleId, String content, Page<MemoryEntry> page);
    
    /**
     * 在指定胶囊中根据内容模糊查询条目
     * @param capsuleId 胶囊ID
     * @param content 内容关键字
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> searchEntriesByContentInCapsule(Long capsuleId, String content, int pageNum, int pageSize);
    
    /**
     * 按创建时间范围查询条目
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> getEntriesByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime, Page<MemoryEntry> page);
    
    /**
     * 按创建时间范围查询条目
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime, int pageNum, int pageSize);

    @Transactional(readOnly = true)
    List<MemoryEntry> getEntriesByTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    @Transactional(readOnly = true)
    IPage<MemoryEntry> getEntriesByTimeRange(LocalDateTime startTime, LocalDateTime endTime, Page<MemoryEntry> page);

    /**
     * 按创建时间范围查询条目（按用户ID）
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesByTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime, int pageNum, int pageSize);
    
    /**
     * 查询包含文件的条目
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> getEntriesWithFiles(Page<MemoryEntry> page);
    
    /**
     * 查询包含文件的条目
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesWithFiles(int pageNum, int pageSize);
    
    /**
     * 查询包含文件的条目（按用户ID）
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 条目分页列表
     */
    Page<MemoryEntry> getEntriesWithFiles(Long userId, int pageNum, int pageSize);
    
    /**
     * 统计包含文件的条目数量
     * @param capsuleId 胶囊ID（null表示所有胶囊）
     * @return 条目数量
     */
    Long countEntriesWithFiles(Long capsuleId);
    
    /**
     * 按文件类型查询条目
     * @param fileType 文件类型
     * @param page 分页参数
     * @return 条目分页列表
     */
    IPage<MemoryEntry> getEntriesByFileType(String fileType, Page<MemoryEntry> page);
    
    /**
     * 软删除条目
     * @param entryId 条目ID
     * @return 是否删除成功
     */
    boolean softDeleteEntry(Long entryId);
    
    /**
     * 恢复已删除的条目
     * @param entryId 条目ID
     * @return 是否恢复成功
     */
    boolean restoreEntry(Long entryId);
    
    /**
     * 更新记忆条目
     * @param entry 条目信息
     * @return 是否更新成功
     */
    boolean updateEntry(MemoryEntry entry);
    
    /**
     * 更新记忆条目内容
     * @param entryId 条目ID
     * @param content 新内容
     * @return 是否更新成功
     */
    boolean updateEntry(Long entryId, String content);
    
    /**
     * 根据用户ID获取所有记忆条目
     * @param userId 用户ID
     * @return 条目列表
     */
    List<MemoryEntry> getEntriesByUserId(Long userId);
    
    /**
     * 搜索记忆条目
     * @param userId 用户ID
     * @param keyword 搜索关键词
     * @param capsuleId 胶囊ID（可选）
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 搜索结果分页列表
     */
    Page<MemoryEntry> searchEntries(Long userId, String keyword, Long capsuleId, int pageNum, int pageSize);
    
    /**
     * 删除记忆条目
     * @param entryId 条目ID
     * @return 是否删除成功
     */
    boolean deleteEntry(Long entryId);
}
